// 串口发送数据
import { ipcMain } from 'electron'
import { SerialPort } from 'serialport'

// 串口发送数据
const com = (): void => {
  let port: SerialPort | null = null
  ipcMain.handle('serial:send', async (event, data): Promise<{ message: string; code: number }> => {
    const { input } = data

    const list = await SerialPort.list()
    const portPath = 'COM1' // 替换为需要发送数据的串口路径
    const baudRate = 9600 // 设置波特率（一般是设备约定的值）

    if (list.length) {
      // 如果存在已打开的串口，复用它
      if (port && port.isOpen) {
        console.log('复用已打开的串口')
        port.write(input, (err) => {
          if (err) {
            return console.error('发送数据时发生错误:', err.message)
          }
          console.log(`数据已发送: ${input}`)
        })
        return { message: '数据发送成功', code: 200 }
      }

      port = new SerialPort(
        {
          path: portPath,
          baudRate: baudRate
        },
        (err) => {
          if (err) {
            return console.error(`无法打开串口 ${portPath}:`, err.message)
          }
          // console.log(`串口 ${portPath} 打开成功！`);
        }
      )
      // 监听串口打开事件
      port.on('open', () => {
        console.log(`正在向 ${portPath} 发送数据...`)

        // 发送数据
        const message = 'Hello, Serial Port!'
        port!.write(input, (err): void => {
          if (err) {
            return console.error('发送数据时发生错误:', err.message)
          }
          console.log(`数据已发送: ${message}`)
          // 确保串口在发送完成后关闭
          // port.close((err) => {
          //   if (err) {
          //     return console.error('关闭串口时发生错误:', err.message)
          //   }
          //   console.log(`串口 ${portPath} 已关闭`)
          // })
        })
      })

      // 监听串口数据接收事件（可选）
      port.on('data', (data) => {
        console.log(`收到串口返回的数据: ${data}`)
        event.sender.send('serial:receive', { message: data.toString() })
      })

      // 监听错误事件
      port.on('error', (err) => {
        console.error('发生错误:', err.message)
      })

      return { message: '串口发送任务启动', code: 200 }
    }

    return {
      message: '串口发送任务启动失败',
      code: 500
    }
  })
}
export default com
